{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "695ff6a5",
   "metadata": {},
   "source": [
    "-------\n",
    "* 记录人：袁玉婷\n",
    "* 时间：2021-11-29\n",
    "* week12\n",
    "* 学习资源：[python 官方网站](https://www.python.org/doc/)    \n",
    " [函数](https://www.cnblogs.com/xuzhichao/p/11570285.html)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "97fae372",
   "metadata": {},
   "source": [
    "# 本周学习目标\n",
    "\n",
    "> 1.函数的定义  \n",
    "> 2.函数的使用  \n",
    "> 3.函数的参数  "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "47477a93",
   "metadata": {},
   "source": [
    "# 函数的定义\n",
    "\n",
    "* 定义一个函数的一般步骤"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "4bb7e557",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0112358\n"
     ]
    }
   ],
   "source": [
    "a,b = 0, 1\n",
    "while a <10:\n",
    "    print(a, end = '') # 0 1 1\n",
    "    a, b = b, a+b # a=1  a=1  b=2  a=2 b=3\n",
    "print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "c50bbdff",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "01123581321345589\n"
     ]
    }
   ],
   "source": [
    "a,b = 0, 1\n",
    "while a <100:\n",
    "    print(a, end = '') # 0 1 1\n",
    "    a, b = b, a+b # a=1  a=1  b=2  a=2 b=3\n",
    "print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "040aee3c",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 我想重复使用某一个功能（避免重复造轮子）\n",
    "# 使用的人可以不懂代码，只要会调用函数即可  function_name()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "71ee4a23",
   "metadata": {},
   "source": [
    "> 1.定义函数的一般方法\n",
    "```\n",
    "def function_name(): # function_name 遵循变量定义的规则  ==>  区别数学函数 f(x)  python的函数可以自定义名称\n",
    "    \"\"\"函数的注释\"\"\"  # 函数的注释可以和使用者交流\n",
    "    函数体        # 函数体要和定义函数保持一定的 tab 缩进 \n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "68fce96c",
   "metadata": {},
   "outputs": [],
   "source": [
    "def fib(n):\n",
    "    \"\"\"print a Fibonacci series up to n\"\"\"\n",
    "    a,b = 0, 1\n",
    "    while a < n:\n",
    "        print(a, end = '') # 0 1 1\n",
    "        a, b = b, a+b # a=1  a=1  b=2  a=2 b=3\n",
    "    print()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bdadfbdf",
   "metadata": {},
   "source": [
    "# 函数的使用"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "ec965379",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0112358\n"
     ]
    }
   ],
   "source": [
    "fib(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "321ac9c6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0112358132134\n"
     ]
    }
   ],
   "source": [
    "fib(50)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "126ead28",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "01123581321345589\n"
     ]
    }
   ],
   "source": [
    "fib(100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "47e9577b",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 1.写一个函数 实现 hello world\n",
    "# 2.写一个函数 实现 hello username"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "f93af023",
   "metadata": {},
   "outputs": [],
   "source": [
    "def he():\n",
    "    \"\"\"print hello world\"\"\"\n",
    "    print(\"hello world\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "46c197a2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "hello world\n"
     ]
    }
   ],
   "source": [
    "he()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "600e5a62",
   "metadata": {},
   "outputs": [],
   "source": [
    "def hee(username):\n",
    "    \"\"\"print username\"\"\"\n",
    "    print(\"hello \"+ username.title())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "c76528ed",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "hello N\n"
     ]
    }
   ],
   "source": [
    "hee(\"n\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "55da4db8",
   "metadata": {},
   "source": [
    "* 函数是否必须有 参数  \n",
    "* 注意：\n",
    "> 1. 在第一行定义函数中，不需要任何信息就能完成工作，因此括号是空的（但括号必不可少）\n",
    "> 2. 要调用函数，可以依次指定函数名及括号括起的必要信息。在第五行代码中，因为此函数 hello（）括号中不需要任何信息，只需要输入hello()即可。和预期效果一样，打印hello,world!\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "12af1835",
   "metadata": {},
   "source": [
    "# 函数的参数\n",
    "\n",
    "> 1. 形式参数：定义函数时，写在 function_name 括号里的参数  \n",
    ">> 1. 在定义函数时，形式参数不占用空间\n",
    "> 2. 实际参数：调用函数时，写在 function_name 括号里的参数\n",
    ">> 1. 在使用函数时，形式参数被分配空间，变为实际参数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "5f7a3ed7",
   "metadata": {},
   "outputs": [],
   "source": [
    "def describe_pet(animal_type,pet_name):\n",
    "    \"\"\"显示宠物信息\"\"\"\n",
    "    print(\"\\nI have a \" + animal_type + \".\")\n",
    "    print(\"My \" +animal_type+ \"'s name is \" + pet_name.title()+ \".\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "2d0673f6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "I have a dog.\n",
      "My dog's name is Dou.\n"
     ]
    }
   ],
   "source": [
    "describe_pet(\"dog\",\"dou\") # \"dog\" \"dou\" 实际参数"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "79780be0",
   "metadata": {},
   "source": [
    "* 当函数具有多个参数时\n",
    "\n",
    "> 1.位置参数      \n",
    ">> 1.形式参数有先后顺序，函数调用过程中应考虑参数的先后顺序，避免出现顺序错误的笑话    \n",
    ">> 2.调用函数过程中要考虑形式参数的个数    \n",
    "\n",
    "> 2.关键字参数    \n",
    ">> 1.调用函数时，通过赋值的方式传递给定义好的形参变量数据  \n",
    ">> 2.关键字参数不考虑先后顺序，因为是指定变量赋值 \n",
    "\n",
    "> 3.默认参数   \n",
    ">> 1.在形式参数中，提前设置一个用户可能使用的参数值  \n",
    ">> 2.用户在使用、调用函数是，可以省略不给默认参数赋值  \n",
    ">> 3.用户给默认参数赋值，将替换默认参数的值  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "id": "0b279ce4",
   "metadata": {},
   "outputs": [],
   "source": [
    "def describe_pet(animal_type,pet_name):\n",
    "    \"\"\"\n",
    "    显示宠物信息\n",
    "    \n",
    "    通过打印的方式显示宠物类型和宠物名称\n",
    "    参数信息：\n",
    "    animal_type： 是一个字符串 宠物类型\n",
    "    pet_name：是一个字符串，宠物名称\n",
    "    \"\"\"\n",
    "    print(\"\\nI have a \" + animal_type + \".\")\n",
    "    print(\"My \" +animal_type+ \"'s name is \" + pet_name.title()+ \".\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "id": "1e51e611",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on function describe_pet in module __main__:\n",
      "\n",
      "describe_pet(animal_type, pet_name)\n",
      "    显示宠物信息\n",
      "    \n",
      "    通过打印的方式显示宠物类型和宠物名称\n",
      "    参数信息：\n",
      "    animal_type： 是一个字符串 宠物类型\n",
      "    pet_name：是一个字符串，宠物名称\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(describe_pet)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "223bbb04",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "I have a dou.\n",
      "My dou's name is Dog.\n"
     ]
    }
   ],
   "source": [
    "# 在使用 describe_pet() 函数时，需要考虑参数的位置，从而进行参数数据的输入（实参的调用）\n",
    "# 位置参数：\n",
    "describe_pet(\"dou\",\"dog\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "13d682dd",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "I have a dog.\n",
      "My dog's name is Dou.\n"
     ]
    }
   ],
   "source": [
    "# 关键字参数\n",
    "\n",
    "describe_pet(animal_type=\"dog\",pet_name=\"dou\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "c819cea2",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 默认参数\n",
    "def describe_pet(pet_name,animal_type=\"dog\"): # animal_type,pet_name 是形式参数 形参\n",
    "    \"\"\"显示宠物信息\"\"\"\n",
    "    print(\"\\nI have a \" + animal_type + \".\")\n",
    "    print(\"My \" + animal_type + \"'s name is \"+pet_name.title() + \".\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "9da8b839",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "I have a dog.\n",
      "My dog's name is 豆豆.\n"
     ]
    }
   ],
   "source": [
    "describe_pet(\"豆豆\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "8d76f9fe",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "I have a cat.\n",
      "My cat's name is 豆豆.\n"
     ]
    }
   ],
   "source": [
    "describe_pet(\"豆豆\",\"cat\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "20a84b08",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "hello\n",
      "hello\n"
     ]
    }
   ],
   "source": [
    "print(\"hello\",\"\\n\",\"hello\",sep=\"\") # sep 取消空格"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "cdfe29ee",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on built-in function print in module builtins:\n",
      "\n",
      "print(...)\n",
      "    print(value, ..., sep=' ', end='\\n', file=sys.stdout, flush=False)\n",
      "    \n",
      "    Prints the values to a stream, or to sys.stdout by default.\n",
      "    Optional keyword arguments:\n",
      "    file:  a file-like object (stream); defaults to the current sys.stdout.\n",
      "    sep:   string inserted between values, default a space.\n",
      "    end:   string appended after the last value, default a newline.\n",
      "    flush: whether to forcibly flush the stream.\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(print)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "310b647b",
   "metadata": {},
   "source": [
    "-----\n",
    "参数使用过程中的思考与问题:\n",
    "\n",
    "> 1.思考：关键字参数（调用函数） 和 位置参数（调用函数） 是否可以一起使用? (可以）  \n",
    ">> 1.positional argument follows keyword argument   位置参数<font style=\"color:red\">都</font>要放在关键字参数 前  \n",
    ">> 2.test1() got multiple values for argument 'x'   映射，不能出现 multiple value（多重值）  \n",
    "\n",
    "> 2.定义函数：默认参数（定义函数） 和 非默认参数（定义函数） 的先后关系\n",
    ">> 1.non-default argument follows default argument  非默认参数<font style=\"color:red\">都</font>要放在默认参数前面\n",
    "\n",
    "-------\n",
    "* 以下为测试代码："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "f5cb5ead",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 案例1\n",
    "def test1(x,y,z):\n",
    "    \"\"\"打印 x,y,z 的值\"\"\"\n",
    "    print(x)\n",
    "    print(y)\n",
    "    print(z)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "id": "cc640ee3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2\n",
      "3\n",
      "4\n"
     ]
    }
   ],
   "source": [
    "test1(2,y=3,z=4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "226045e6",
   "metadata": {},
   "outputs": [
    {
     "ename": "SyntaxError",
     "evalue": "positional argument follows keyword argument (<ipython-input-52-055790d85cfd>, line 1)",
     "output_type": "error",
     "traceback": [
      "\u001b[1;36m  File \u001b[1;32m\"<ipython-input-52-055790d85cfd>\"\u001b[1;36m, line \u001b[1;32m1\u001b[0m\n\u001b[1;33m    test1(x=2,4,z=3)\u001b[0m\n\u001b[1;37m              ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m positional argument follows keyword argument\n"
     ]
    }
   ],
   "source": [
    "test1(x=2,4,z=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "id": "a9db8002",
   "metadata": {},
   "outputs": [
    {
     "ename": "TypeError",
     "evalue": "test1() got multiple values for argument 'x'",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mTypeError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-50-761a345cdd84>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mtest1\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0my\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m3\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mz\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m4\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;31mTypeError\u001b[0m: test1() got multiple values for argument 'x'"
     ]
    }
   ],
   "source": [
    "test1(2,x=1,y=3,z=4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "fcb11177",
   "metadata": {},
   "outputs": [
    {
     "ename": "SyntaxError",
     "evalue": "non-default argument follows default argument (<ipython-input-51-c72a5a6c6b66>, line 2)",
     "output_type": "error",
     "traceback": [
      "\u001b[1;36m  File \u001b[1;32m\"<ipython-input-51-c72a5a6c6b66>\"\u001b[1;36m, line \u001b[1;32m2\u001b[0m\n\u001b[1;33m    def test1(x,y=3,z):\u001b[0m\n\u001b[1;37m              ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m non-default argument follows default argument\n"
     ]
    }
   ],
   "source": [
    "# 案例2\n",
    "def test1(x,y=3,z):\n",
    "    \"\"\"打印 x,y,z 的值\"\"\"\n",
    "    print(x)\n",
    "    print(y)\n",
    "    print(z)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b3db1872",
   "metadata": {},
   "source": [
    "## 课本练习实践\n",
    "\n",
    "> 1.总结函数的优势  \n",
    "> 2.预习课本第四章 函数与模块  \n",
    ">> 1.完成课本元音字母实践   \n",
    ">> 2.浏览模块，创建模块和调用模块，了解 PEP & python国际代码标准   \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "id": "19e56a69",
   "metadata": {},
   "outputs": [],
   "source": [
    "def search4vowels(word):\n",
    "    \"\"\"判断输入文本出现的原因字母有哪些\"\"\"\n",
    "    vowels = set(\"aeiou\")\n",
    "    word = set(word)\n",
    "    print(vowels & word)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "id": "a74570d5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'e', 'u', 'a'}\n"
     ]
    }
   ],
   "source": [
    "search4vowels(\"hkahfueanlfvv\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6eed2234",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "hide_input": false,
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.8"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
